package com.smart.community.property.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.smart.community.property.entity.BillingMethod;
import com.smart.community.property.vo.BillingMethodVO;

/**
 * 计费方式Mapper接口
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 1.0.0
 */
@Mapper
public interface BillingMethodMapper extends BaseMapper<BillingMethod> {

    /**
     * 分页查询计费方式（包含物业公司信息）
     * 
     * @param page 分页参数
     * @param propertyCompanyId 物业公司ID
     * @param feeType 费用类型
     * @param buildingTypeName 建筑类型名称
     * @param methodName 计费方式名称
     * @param methodType 计费类型（0-按面积计费，1-固定费用，2-阶梯计费，3-按表计费，4-阶梯电价）
     * @param includeAllBuildingTypes 是否包含适用于所有建筑类型的计费方式
     * @return 分页结果
     */
    IPage<BillingMethodVO> selectPageWithPropertyCompany(
        Page<BillingMethodVO> page,
        @Param("propertyCompanyId") Long propertyCompanyId,
        @Param("feeType") String feeType,
        @Param("buildingTypeName") String buildingTypeName,
        @Param("methodName") String methodName,
        @Param("methodType") String methodType,
        @Param("includeAllBuildingTypes") Boolean includeAllBuildingTypes
    );

    /**
     * 根据物业公司ID列表和费用类型查询计费方式列表
     * 
     * @param propertyCompanyIds 物业公司ID列表
     * @param feeType 费用类型
     * @param buildingTypeName 建筑类型名称
     * @return 计费方式列表
     */
    List<BillingMethodVO> selectByPropertyCompanyIdsAndFeeType(
        @Param("propertyCompanyIds") List<Long> propertyCompanyIds,
        @Param("feeType") String feeType,
        @Param("buildingTypeName") String buildingTypeName
    );

    /**
     * 根据ID查询计费方式详情（包含物业公司信息）
     * 
     * @param id 计费方式ID
     * @return 计费方式详情
     */
    BillingMethodVO selectDetailById(@Param("id") Long id);

    /**
     * 检查计费方式是否存在重复
     * 
     * @param propertyCompanyId 物业公司ID
     * @param feeType 费用类型
     * @param buildingTypeName 建筑类型名称
     * @param methodType 计费类型（0-按面积计费，1-固定费用，2-阶梯计费，3-按表计费，4-阶梯电价）
     * @param excludeId 排除的ID
     * @return 重复记录数量
     */
    int countDuplicate(
        @Param("propertyCompanyId") Long propertyCompanyId,
        @Param("feeType") String feeType,
        @Param("buildingTypeName") String buildingTypeName,
        @Param("methodType") String methodType,
        @Param("excludeId") Long excludeId
    );

    /**
     * 根据建筑类型名称查询适用的计费方式
     * 
     * @param propertyCompanyId 物业公司ID
     * @param feeType 费用类型
     * @param buildingTypeName 建筑类型名称
     * @return 计费方式列表
     */
    List<BillingMethodVO> selectApplicableByBuildingType(
        @Param("propertyCompanyId") Long propertyCompanyId,
        @Param("feeType") String feeType,
        @Param("buildingTypeName") String buildingTypeName
    );

    /**
     * 根据计费方式名称模糊查询
     * 
     * @param methodName 计费方式名称
     * @param propertyCompanyId 物业公司ID
     * @return 计费方式列表
     */
    List<BillingMethodVO> selectByMethodNameLike(
        @Param("methodName") String methodName,
        @Param("propertyCompanyId") Long propertyCompanyId
    );

    /**
     * 根据状态查询计费方式列表
     * 
     * @param status 状态（0-禁用，1-启用）
     * @param propertyCompanyId 物业公司ID
     * @return 计费方式列表
     */
    List<BillingMethodVO> selectByStatus(
        @Param("status") Integer status,
        @Param("propertyCompanyId") Long propertyCompanyId
    );
}
